// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

namespace Neto.Db.EF;

/// <summary>
///     Furion 分页扩展
/// </summary>
[SuppressSniffer]
public static class FurionPagedExtensions
{
    ///// <summary>
    ///// 分页扩展(返回支持layui格式的数据)
    ///// </summary>
    ///// <typeparam name="TEntity"></typeparam>
    ///// <param name="entities"></param>
    ///// <param name="pageIndex">查询页数</param>
    ///// <param name="pageSize">条数</param>
    ///// <returns></returns>
    //public static LayuiPagedList<TEntity> ToPagedListToLayui<TEntity>(this IQueryable<TEntity> entities, long pageIndex = 1, long pageSize = 20)
    //{
    //    var totalCount = entities.Count();
    //    var items = entities.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
    //    var totalPages = (long)Math.Ceiling(totalCount / (double)pageSize);

    //    return new LayuiPagedList<TEntity>
    //    {
    //        page = pageIndex,
    //        limit = pageSize,
    //        data = items,
    //        count = totalCount,
    //        totalpage = totalPages
    //    };
    //}

    ///// <summary>
    ///// 分页扩展(返回支持layui格式的数据)
    ///// </summary>
    ///// <typeparam name="TEntity"></typeparam>
    ///// <param name="entities"></param>
    ///// <param name="pageIndex">查询页数</param>
    ///// <param name="pageSize">条数</param>
    ///// <param name="cancellationToken"></param>
    ///// <returns></returns>
    //public static async Task<LayuiPagedList<TEntity>> ToLayuiPagedListAsync<TEntity>(this IQueryable<TEntity> entities, long pageIndex = 1, long pageSize = 20, CancellationToken cancellationToken = default)
    //{
    //    var totalCount = await entities.CountAsync(cancellationToken);
    //    var items = await entities.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync(cancellationToken);
    //    var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize);

    //    return new LayuiPagedList<TEntity>
    //    {
    //        page = pageIndex,
    //        limit = pageSize,
    //        data = items,
    //        count = totalCount,
    //        totalpage = totalPages
    //    };
    //}

    #region furion

    /// <summary>
    ///     分页扩展
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    /// <param name="entities"></param>
    /// <param name="pageIndex">索引</param>
    /// <param name="pageSize">条数</param>
    /// <returns></returns>
    public static PagedList<TEntity> ToPagedList<TEntity>(this IList<TEntity> entities, int pageIndex = 1,
        int pageSize = 20)
        where TEntity : new()
    {
        var totalCount = entities.Count;
        var items = entities.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
        var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize);

        return new PagedList<TEntity>
        {
            PageIndex = pageIndex,
            PageSize = pageSize,
            Items = items,
            TotalCount = totalCount,
            TotalPages = totalPages,
            HasNextPages = pageIndex < totalPages,
            HasPrevPages = pageIndex - 1 > 0
        };
    }

    /// <summary>
    ///     分页扩展
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="entities"></param>
    /// <param name="pageIndex">索引</param>
    /// <param name="pageSize">条数</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public static async Task<PagedList<TEntity>> ToPagedListAsync<TEntity>(this IList<TEntity> entities,
        int pageIndex = 1, int pageSize = 20, CancellationToken cancellationToken = default)
        where TEntity : new()
    {
        var totalCount = await entities.CountAsync(cancellationToken);
        var items = await entities.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync(cancellationToken);
        var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize);

        return new PagedList<TEntity>
        {
            PageIndex = pageIndex,
            PageSize = pageSize,
            Items = items,
            TotalCount = totalCount,
            TotalPages = totalPages,
            HasNextPages = pageIndex < totalPages,
            HasPrevPages = pageIndex - 1 > 0
        };
    }

    #endregion furion
}